{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Notes:\n",
    " * final dataset, after revisions\n",
    " * several bug fixes in pipeline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['/mnt/tess/astronet/checkpoints/extended_23_run_14/1/AstroCNNModel_extended_20210131_212427',\n",
       " '/mnt/tess/astronet/checkpoints/extended_23_run_14/2/AstroCNNModel_extended_20210131_215717',\n",
       " '/mnt/tess/astronet/checkpoints/extended_23_run_14/3/AstroCNNModel_extended_20210131_222957',\n",
       " '/mnt/tess/astronet/checkpoints/extended_23_run_14/4/AstroCNNModel_extended_20210131_230255',\n",
       " '/mnt/tess/astronet/checkpoints/extended_23_run_14/5/AstroCNNModel_extended_20210131_233546',\n",
       " '/mnt/tess/astronet/checkpoints/extended_23_run_14/6/AstroCNNModel_extended_20210201_000826',\n",
       " '/mnt/tess/astronet/checkpoints/extended_23_run_14/7/AstroCNNModel_extended_20210201_004107',\n",
       " '/mnt/tess/astronet/checkpoints/extended_23_run_14/8/AstroCNNModel_extended_20210201_011350',\n",
       " '/mnt/tess/astronet/checkpoints/extended_23_run_14/9/AstroCNNModel_extended_20210201_014655',\n",
       " '/mnt/tess/astronet/checkpoints/extended_23_run_14/10/AstroCNNModel_extended_20210201_021945']"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import os\n",
    "\n",
    "chkpt_root = '/mnt/tess/astronet/checkpoints/extended_23_run_14'\n",
    "data_files = '/mnt/tess/astronet/tfrecords-23-val/*'\n",
    "tces_file = '/mnt/tess/astronet/tces-v6-val.csv'\n",
    "\n",
    "nruns = 10\n",
    "\n",
    "def load_ensemble(chkpt_root, nruns):\n",
    "    checkpts = []\n",
    "    for i in range(nruns):\n",
    "        parent = os.path.join(chkpt_root, str(i + 1))\n",
    "        if not os.path.exists(parent):\n",
    "            break\n",
    "        all_dirs = os.listdir(parent)\n",
    "        if not all_dirs:\n",
    "            break\n",
    "        d, = all_dirs\n",
    "        checkpts.append(os.path.join(parent, d))\n",
    "    return checkpts\n",
    "\n",
    "paths = load_ensemble(chkpt_root, nruns)\n",
    "paths"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Running model 1\n",
      "Binary prediction threshold: 0.2152499407880693 (orientative)\n",
      "2228 records\n",
      "Running model 2\n",
      "Binary prediction threshold: 0.2152499407880693 (orientative)\n",
      "2228 records\n",
      "Running model 3\n",
      "Binary prediction threshold: 0.2152499407880693 (orientative)\n",
      "2228 records\n",
      "Running model 4\n",
      "Binary prediction threshold: 0.2152499407880693 (orientative)\n",
      "2228 records\n",
      "Running model 5\n",
      "Binary prediction threshold: 0.2152499407880693 (orientative)\n",
      "2228 records\n",
      "Running model 6\n",
      "Binary prediction threshold: 0.2152499407880693 (orientative)\n",
      "2228 records\n",
      "Running model 7\n",
      "Binary prediction threshold: 0.2152499407880693 (orientative)\n",
      "2228 records\n",
      "Running model 8\n",
      "Binary prediction threshold: 0.2152499407880693 (orientative)\n",
      "2228 records\n",
      "Running model 9\n",
      "Binary prediction threshold: 0.2152499407880693 (orientative)\n",
      "2228 records\n",
      "Running model 10\n",
      "Binary prediction threshold: 0.2152499407880693 (orientative)\n",
      "2228 records\n"
     ]
    }
   ],
   "source": [
    "import getpass\n",
    "import os\n",
    "from astronet import predict\n",
    "import tensorflow as tf\n",
    "\n",
    "\n",
    "def run_predictions(path):\n",
    "    predict.FLAGS = predict.parser.parse_args([\n",
    "      '--model_dir', path,\n",
    "      '--data_files', data_files,\n",
    "      '--output_file', '',\n",
    "    ])\n",
    "\n",
    "    return predict.predict()\n",
    "\n",
    "\n",
    "paths = load_ensemble(chkpt_root, nruns)\n",
    "ensemble_preds = []\n",
    "config = None\n",
    "for i, path in enumerate(paths):\n",
    "    print(f'Running model {i + 1}')\n",
    "    preds, config = run_predictions(path)\n",
    "    ensemble_preds.append(preds.set_index('tic_id'))\n",
    "    print()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "labels = ['disp_E', 'disp_N', 'disp_J', 'disp_S', 'disp_B']\n",
    "\n",
    "col_e = labels.index('disp_E')\n",
    "thresh = config.hparams.prediction_threshold\n",
    "# thresh = 0.95"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "\n",
    "agg_preds = {}\n",
    "\n",
    "for preds in ensemble_preds:\n",
    "    for tic_id in preds.index:\n",
    "        if tic_id not in agg_preds:\n",
    "            agg_preds[tic_id] = []\n",
    "\n",
    "        row = preds[preds.index == tic_id]\n",
    "        pred_v = row.values[0]\n",
    "        if len(row.values) > 1:\n",
    "            print(f'Warning: duplicate predictions for {tic_id}')\n",
    "        if pred_v[col_e] >= thresh:\n",
    "            agg_preds[tic_id].append('disp_E')\n",
    "        else:\n",
    "            masked_v = [v if i != col_e else 0 for i, v in enumerate(pred_v)]\n",
    "            agg_preds[tic_id].append(preds.columns[np.argmax(masked_v)])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "final_preds = []\n",
    "for tic_id in list(agg_preds.keys()):\n",
    "    counts = {l: 0 for l in labels}\n",
    "    for e in agg_preds[tic_id]:\n",
    "        counts[e] += 1\n",
    "    maxcount = max(counts.values())\n",
    "    counts.update({\n",
    "        'tic_id': tic_id,\n",
    "        'maxcount': maxcount,\n",
    "    })\n",
    "    final_preds.append(counts)\n",
    "    \n",
    "final_preds = pd.DataFrame(final_preds).set_index('tic_id')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "tce_table = pd.read_csv(tces_file, header=0).set_index('tic_id')\n",
    "tce_labels = tce_table[labels]\n",
    "\n",
    "pl = final_preds.join(tce_labels, on='tic_id', how='left', lsuffix='_p')\n",
    "\n",
    "pl.head()\n",
    "pd.set_option('display.max_columns', None)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Recall: 0.9782608695652174\n",
      "Precision: 0.7894736842105263\n"
     ]
    }
   ],
   "source": [
    "ppos = (pl['disp_E_p'] > 0)\n",
    "pos = (pl['disp_E'] > 0)\n",
    "\n",
    "pneg = (pl['disp_E_p'] == 0)\n",
    "neg = (pl['disp_E'] == 0)\n",
    "\n",
    "print('Recall:', len(pl[ppos & pos]) / len(pl[pos]))\n",
    "print('Precision:', len(pl[ppos & pos]) / len(pl[ppos]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "118412801\n",
      "141753278\n",
      "158159741\n",
      "349412074\n",
      "404220255\n"
     ]
    }
   ],
   "source": [
    "for i in pl[pos & pneg][[]].join(tce_table, on='tic_id', how='left').index:\n",
    "    print(i)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "113496703\n",
      "118398402\n",
      "201601338\n",
      "219945452\n",
      "276738707\n",
      "277941517\n",
      "278632192\n",
      "281578420\n",
      "291374558\n",
      "293527927\n",
      "294399290\n",
      "30407196\n",
      "311103813\n",
      "319865847\n",
      "320356995\n",
      "326693475\n",
      "363404187\n",
      "373919592\n",
      "404851508\n",
      "404851552\n",
      "404851966\n",
      "404934011\n",
      "40602499\n",
      "406971913\n",
      "407615704\n",
      "409934386\n",
      "283330382\n",
      "375927073\n",
      "14209654\n",
      "188258751\n",
      "199376584\n",
      "267924099\n",
      "136651206\n",
      "154214348\n",
      "277848886\n",
      "395164445\n",
      "417208086\n",
      "469465627\n",
      "252588526\n",
      "192591652\n",
      "198555242\n",
      "279064110\n",
      "468608862\n",
      "127846210\n",
      "408945155\n",
      "648359612\n",
      "56861756\n",
      "138847344\n",
      "290991351\n",
      "154271808\n",
      "159636125\n",
      "230197530\n",
      "284266496\n",
      "298647682\n",
      "164528404\n",
      "165500081\n",
      "233197293\n",
      "237278147\n",
      "27896467\n",
      "405687343\n"
     ]
    }
   ],
   "source": [
    "for i in pl[neg & ppos][[]].join(tce_table, on='tic_id', how='left').index:\n",
    "    print(i)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>disp_E</th>\n",
       "      <th>disp_N</th>\n",
       "      <th>disp_J</th>\n",
       "      <th>disp_S</th>\n",
       "      <th>disp_B</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>tic_id</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "Empty DataFrame\n",
       "Columns: [disp_E, disp_N, disp_J, disp_S, disp_B]\n",
       "Index: []"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def compare(ensemble_preds, filter):\n",
    "    result = ensemble_preds[0][filter]\n",
    "    for preds in ensemble_preds[1:]:\n",
    "        result = result.append(preds[filter])\n",
    "    return result\n",
    "\n",
    "compare(ensemble_preds, preds.index == 249951802)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>disp_E_p</th>\n",
       "      <th>disp_N_p</th>\n",
       "      <th>disp_J_p</th>\n",
       "      <th>disp_S_p</th>\n",
       "      <th>disp_B_p</th>\n",
       "      <th>maxcount</th>\n",
       "      <th>disp_E</th>\n",
       "      <th>disp_N</th>\n",
       "      <th>disp_J</th>\n",
       "      <th>disp_S</th>\n",
       "      <th>disp_B</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>tic_id</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "Empty DataFrame\n",
       "Columns: [disp_E_p, disp_N_p, disp_J_p, disp_S_p, disp_B_p, maxcount, disp_E, disp_N, disp_J, disp_S, disp_B]\n",
       "Index: []"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pl[pl.index == 421845505]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### PR curve"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "tics = set(ensemble_preds[0].index.values)\n",
    "\n",
    "tic_index = {v: i for i, v in enumerate(tics)}\n",
    "\n",
    "pred_es = np.zeros([len(ensemble_preds), len(tic_index)])\n",
    "for i, preds in enumerate(ensemble_preds):\n",
    "    for row in preds.iterrows():\n",
    "        tic, pred_e = row[0], row[1][col_e]\n",
    "        pred_es[i][tic_index[tic]] = pred_e\n",
    "\n",
    "lbl_es = np.zeros([len(tic_index)], dtype=np.bool)\n",
    "for row in tce_labels.iterrows():\n",
    "    tic, lbl_e = row[0], row[1]['disp_E']\n",
    "    if tic in tic_index:\n",
    "        lbl_es[tic_index[tic]] = (lbl_e > 0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "num_cond_pos = float(np.sum(lbl_es))\n",
    "\n",
    "def pr_at_th(th):\n",
    "    pred_pos = np.any(pred_es >= th, axis=0)\n",
    "    true_pos = pred_pos & lbl_es\n",
    "    num_pred_pos = int(np.sum(pred_pos))\n",
    "    num_true_pos = int(np.sum(true_pos))\n",
    "    if num_pred_pos == 0:\n",
    "        return 1.0, 0.0\n",
    "    return float(num_true_pos) / float(num_pred_pos), float(num_true_pos) / float(num_cond_pos)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "AUC: 0.9805630591446552, max R: 1.0, max P: 1.0\n",
      "100% recall at: 59%, threshold: 0.030485098838860747\n"
     ]
    },
    {
     "data": {
      "image/png": "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1pNPPilJL33PS5cu1amnnqrh4eGy3+vFF18sM9OWLVu0f//+CdtWr16to446Si+88IK2bNkyYdvixYu1du1auXvZ/Z5//vlqbW3Vtm3b9MILL0zYdvzxx+uYY47Rvn379Nhjj03Y1t7ernPOOUeS9NBDD035D2bdunXq6urSzp079fTTT0/Ytnz5cq1atUo9PT166KGHJmxrbm7WBRdcIEl69NFHp/zndPrpp+vQQw/VM888ox07dkzYtmzZMp188skaHBws+71yjIikcYx46qmntHTpUo4RczhGFHGMiGTxGFH8ED82Njbl36PEMaKIzxGRhXyMkDTlPeYYEeFzRGQhHyMm/zvOOgvxAjtmtkLSr+PVf3D3t83Q/teKZnk84e6rajiOr0p6V7z6LXd/ezWvv+GGG14maackvelNb9LSpUtf2tbU1KRCoaCxsbGX/hMoftAoXab6ms/qa97+QrN37151d3drzZo1am9v56+4Vb6H/IVmYRwj+vr61N3d/dIHdY4R2f4rLseIuc/02Lx5s8466yyZ2ZT9coyI8DkislCPEQcOHNDGjRtf+twym/eQY0SEzxHjsnyMuPwROuQLAAAgAElEQVQTd+iy4fuLm1Zcd911Fc+eSFuoRY/DJRVL1Le6+9UztH9W0jJJj7r76TUaw0clfSJevU/S5e5e1dVIS4se1157rQ455JBaDA3InLGxMY2MjKipqUkNDSFffxl5Rs4RAnKOEJBz5N3LP/lvunTo3uJq5oseoZ7eUlrem80pKx3xc00uwWxm79F4waNb0murLXhMxgEVedbQ0KCWlpa0hwEkipwjBOQcISDnQLYE+Zuyuw9IKp4E9rJKbc1sicaLHjsrtZ0NM3urpC/HqzskvdLdX6jwklmZPP0IyJP+/n49+uijU6YUAnlCzhECco4QkHMgW4IsesSKV7dZZWaVZrysKVme051Viszs9ZK+reh9f0bSFe5ek6lAk89pA/JkZGREe/bsIefINXKOEJBzhICcA9kSctHjp/Fzh6SzK7S7tGT57rl2ZmZXSPonRacU7VE0w+OJue4PAAAAAABUFnLR419Llt9RroGZNUgq3tlln6QfzqUjM7tA0u2SWiXtl/Rqd3+s8qsAAAAAAMB8BFv0cPd7Jf0kXr3GzDaUafZBSSfHy1909wn3LzKzy8zM48dN5foxs7WS7lA0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\n",
      "text/plain": [
       "<Figure size 1200x740 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from matplotlib import pyplot as plt\n",
    "\n",
    "ps, rs, ths = ([], [], [])\n",
    "th = np.max(pred_es)\n",
    "while th >= 0.0:\n",
    "    p, r = pr_at_th(th)\n",
    "    if p > 0:\n",
    "        ps.append(p)\n",
    "        rs.append(r)\n",
    "    else:\n",
    "        ps.append(1.0)\n",
    "        rs.append(0.0)\n",
    "    ths.append(th)\n",
    "    th -= 0.0005\n",
    "    \n",
    "from sklearn import metrics\n",
    "\n",
    "print(f'AUC: {metrics.auc(rs, ps)}, max R: {max(rs)}, max P: {max(ps)}')\n",
    "    \n",
    "i = len(rs) - 1\n",
    "while rs[i] == 1.0:\n",
    "    i -= 1\n",
    "i += 1\n",
    "print(f'100% recall at: {int(ps[i] * 100)}%, threshold: {ths[i]}')\n",
    "\n",
    "fig, ax = plt.subplots(figsize=(6, 3.7), dpi=200)\n",
    "\n",
    "ax.spines['top'].set_color('#808080')\n",
    "ax.spines['right'].set_color('#808080')\n",
    "ax.spines['left'].set_color('#808080')\n",
    "ax.spines['bottom'].set_color('#808080')\n",
    "ax.tick_params(direction='in', color='#808080')\n",
    "\n",
    "plt.grid(color='#c0c0c0', linestyle='--', linewidth=0.5)\n",
    "\n",
    "plt.ylabel('Precision', fontweight='bold')\n",
    "plt.xlabel('Recall', fontweight='bold')\n",
    "\n",
    "plt.xlim((0.0, 1.0))\n",
    "plt.ylim((0.0, 1.0))\n",
    "\n",
    "_ = plt.plot(rs, ps)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
